package com.rc.saas.tenant.transfers.jaxb;

import javax.xml.bind.Marshaller;
import java.lang.reflect.Field;

/**
 * 编组和解组监听器
 * 当为给实体类设置有效属性值:比如,设置实体类字段值为null时,
 * 转化XML时会出现节点丢失问题(null值得属性不会转化为节点并输出到文件)
 * Created by Sven on 2021/09/10
 */
public class MarshallerListener extends Marshaller.Listener {
    public static final String BLANK_CHAR = "";

    @Override
    public void beforeMarshal(Object source) {
        super.beforeMarshal(source);
        //反射 获取所有属性
        Field[] fields = source.getClass().getDeclaredFields();
        for (Field field : fields) {
            //允许获取私有属性
            field.setAccessible(true);
            try {
                //只针对String类型的,其他类型单独处理
                if (field.getType() == String.class && field.get(source) == null) {
                    //设置属性值
                    field.set(source, BLANK_CHAR);
                }
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        }
    }
}
